#ifndef GUI_BRIDGE_H
#define GUI_BRIDGE_H

/* --- C兼容部分（在C和C++中都可用） --- */

#ifdef __cplusplus
extern "C"
{
#endif

    /* 文件项结构体的C版本 */
    typedef struct
    {
        char name[256];        /* 文件或目录名 */
        char type[32];         /* 如 "file", "directory" */
        long long size;        /* 文件大小（字节） */
        char permissions[32];  /* 权限字符串 */
        char lastModified[64]; /* 最后修改时间 */
    } sfts_FileListItem_C;

    /* C语言回调函数接口 */
    /**
     * @brief 通知UI登录结果
     * @param success 1表示成功，0表示失败
     * @param username_or_error_message 如果成功则为用户名，否则为错误消息
     */
    void sfts_ui_on_login_result(int success, const char *username_or_error_message);

    /**
     * @brief 通知UI文件列表已更新
     * @param items 文件项数组
     * @param count 数组中的项目数
     */
    void sfts_ui_on_file_list_updated(sfts_FileListItem_C *items, int count);

    /**
     * @brief 通知UI获取文件列表时发生错误
     * @param path 请求的文件路径
     * @param error_message 错误描述
     */
    void sfts_ui_on_file_list_error(const char *path, const char *error_message);

    /**
     * @brief 向UI发送日志消息
     * @param message 日志消息
     * @param is_error 1表示错误消息，0表示普通消息
     */
    void sfts_ui_on_log_message(const char *message, int is_error);

    /**
     * @brief 通知UI文件传输进度
     * @param filename 正在传输的文件名
     * @param percentage 进度百分比（0-100）
     * @param status_message 状态消息（如"上传中..."）
     */
    void sfts_ui_on_transfer_progress(const char *filename, int percentage, const char *status_message);

    /**
     * @brief 通知UI文件传输完成
     * @param filename 文件名
     * @param success 1表示成功，0表示失败
     * @param message 结果消息
     */
    void sfts_ui_on_transfer_complete(const char *filename, int success, const char *message);

    /**
     * @brief 通知UI注册结果
     * @param success 1表示成功，0表示失败
     * @param message 结果消息（如用户名或错误信息）
     */
    void sfts_ui_on_registration_result(int success, const char *message);

    /**
     * @brief 通知UI文件删除结果
     * @param success 1表示成功，0表示失败
     * @param filename 已删除的文件名
     * @param message 结果消息
     */
    void sfts_ui_on_delete_result(int success, const char *filename, const char *message);

#ifdef __cplusplus
} /* extern "C" */
#endif

/* --- 仅C++部分（只在C++代码中可用） --- */
#ifdef __cplusplus

#include <QObject>
#include <QString>
#include <QList>

/* Qt数据结构 */
struct FileItemData
{
    QString name;
    QString type;
    qint64 size;
    QString permissions;
    QString lastModified;
};
Q_DECLARE_METATYPE(FileItemData)

/* 类型别名以保持兼容性 */
typedef FileItemData FileItem;

/* Qt信号发射器类 */
class GuiSignaler : public QObject
{
    Q_OBJECT

public:
    static GuiSignaler *instance();

public slots:
    /* 从C回调转发到Qt信号的方法 */
    void emitLoginResult(bool success, const QString &message);
    void emitFileListUpdated(const QList<FileItem> &files);
    void emitLogMessage(const QString &message, bool isError);
    void emitTransferProgress(const QString &filename, int percentage, const QString &status);
    void emitTransferCompleted(const QString &filename, bool success, const QString &message);
    void emitRegistrationResult(bool success, const QString &message);
    void emitDeleteResult(bool success, const QString &filename, const QString &message);

signals:
    void loginResultReceived(bool success, const QString &message);
    void fileListUpdated(const QList<FileItem> &files);
    void logMessageReceived(const QString &message, bool isError);
    void transferProgressUpdated(const QString &filename, int percentage, const QString &status);
    void transferCompleted(const QString &filename, bool success, const QString &message);
    void registrationResultCb(bool success, const QString &message);
    void deleteResultCb(bool success, const QString &filename, const QString &message);

private:
    GuiSignaler(QObject *parent = nullptr);
    ~GuiSignaler() = default;
    GuiSignaler(const GuiSignaler &) = delete;
    GuiSignaler &operator=(const GuiSignaler &) = delete;

    static GuiSignaler *s_instance;
};

#endif /* __cplusplus */

#endif /* GUI_BRIDGE_H */